<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 数组新增

    // 构造函数Array的方法
    // Array.from()
    // Array.of()   方法用于将一组值，转换为数组。

    // var arr = Array.of(3, 11, 8) // [3,11,8]
    // console.log(arr);

    // Array.myOf = function(){
    //     return [...arguments];
    // }

    // var list = [2,8,4,6,5,7,9,3,1];
    // var index = list.indexOf(6);  // 查找某个元素 在数组中第一次出现的位置
    // console.log(index);

    // 数组的拓展方法 (所有的数组均可以使用)
    // find(callback)    用于找出第一个符合条件的数组成员
    // 作用:  遍历数组,每次循环时执行传入的回调函数,回调函数返回一个条件,如果条件成立则返回直接返回该元素  否则返回undefined

    // findIndex(callback)    用于找出第一个符合条件的数组元素的下标
    // 作用:  遍历数组,每次循环时执行传入的回调函数,回调函数返回一个条件,如果条件成立则返回直接返回该元素对应的下标  否则返回-1

    /* var list = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    var result = list.find(function (item, index, array) {
        console.log(item, index, array);
        return item % 2 == 0 && item % 3 == 0;
    })
    console.log(result); */


    /* var list = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    var result = list.findIndex(function (item, index, array) {
        console.log(item, index, array);
        return item % 2 == 0 && item % 3 == 0;
    })
    console.log(result); */


    // fill()   使用给定值，填充一个数组。
    // 返回值 填充后的原数组
    // 是否影响原数组 :  影响

    /* var list = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    var result = list.fill(1);
    console.log(result); //[1, 1, 1, 1, 1, 1, 1, 1, 1]
    console.log(list);  //[1, 1, 1, 1, 1, 1, 1, 1, 1] */

    /* var arr = new Array(2).fill(true);
    console.log(arr); */

    // 注意: fill方法还可以接受第二个和第三个参数，用于指定填充的起始位置和结束位置。
    /* var list = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    list.fill(1,2,5);  // [2,5)    [2, 8, 1, 1, 1, 7, 9, 3, 1]
    console.log(list); */


    // includes()

    /* var list = [2, 8, 4, 6, 5, 7, NaN, 9, 3, 1];
    console.log(list.indexOf(NaN));
    console.log(list.includes(NaN));   // includes使用的是不一样的判断算法，就没有这个问题。 */

    // flat() 用于将嵌套的数组“拉平”，变成一维的数组。该方法返回一个新数组，对原数据没有影响。
    // flat()默认只会“拉平”一层，如果想要“拉平”多层的嵌套数组，可以将flat()方法的参数写成一个整数，表示想要拉平的层数，默认为1。
    // 如果不管有多少层嵌套，都要转成一维数组，可以用Infinity关键字作为参数。

    // var list = [1,2,[3,4]];
    // var arr = list.flat();  // 默认只拉平一层
    // console.log(arr);

    // var list = [1,2,[3,4,[5,6]]];
    // var arr = list.flat(2);  // 拉平2层
    // console.log(arr);

    // var list = [1,2,[3,4,[5,6,[7,8,[9,10,[11,[12,[13,[14]]]]]]]]];
    // var arr = list.flat(Infinity);  // 
    // console.log(arr);

    // flatMap()    map和flat的组合版 (现根据回调函数的返回值生成新数组 在对该数组进行拉平处理  => flatMap()只能展开一层数组。)
    /* var list = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    var arr = list.map(function(item,index){
        return [item,index];
    })
    console.log(arr);
    var result = arr.flat();
    console.log(result); //[2, 0, 8, 1, 4, 2, 6, 3, 5, 4, 7, 5, 9, 6, 3, 7, 1, 8] */


    var list = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    var result = list.flatMap(function(item,index){
        return [item,index];
    })
    console.log(result);//[2, 0, 8, 1, 4, 2, 6, 3, 5, 4, 7, 5, 9, 6, 3, 7, 1, 8]

</script>
</html>